package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.caelum.jdbc.modelo.Categoria;
import br.com.caelum.jdbc.modelo.Produto;

public class CategoriasDAO {

	private final Connection	conn;

	public CategoriasDAO(final Connection conn) {
		this.conn = conn;
	}

	public List<Categoria> lista() throws SQLException {
		final List<Categoria> categorias = new ArrayList<>();

		final String sql = "Select * from Categoria";
		try (PreparedStatement preparedStatement = this.conn.prepareStatement(sql)) {
			preparedStatement.execute();

			try (ResultSet rs = preparedStatement.getResultSet()) {
				while (rs.next()) {
					final int id = rs.getInt("id");
					final String nome = rs.getString("nome");
					final Categoria categoria = new Categoria(id, nome);
					categorias.add(categoria);
				}
			}
		}
		return categorias;
	}

	public List<Categoria> listaComProdutos() throws SQLException {
		final List<Categoria> categorias = new ArrayList<>();
		Categoria ultima = null;

		final String sql = "select c.id as c_id, c.nome as c_nome, p.id as p_id, p.nome as p_nome, p.descricao as p_descricao "
				+ "from Categoria as c join Produto as p on p.categoria_id = c.id";
		try (PreparedStatement preparedStatement = this.conn.prepareStatement(sql)) {
			preparedStatement.execute();

			try (ResultSet rs = preparedStatement.getResultSet()) {
				while (rs.next()) {
					final int id = rs.getInt("c_id");
					final String nome = rs.getString("c_nome");
					if ((ultima == null) || (!ultima.getNome().equals(nome))) {
						final Categoria categoria = new Categoria(id, nome);
						categorias.add(categoria);
						ultima = categoria;
					}
					final int idDoProduto = rs.getInt("p_id");
					final String nomeDoProduto = rs.getString("p_nome");
					final String descricaoDoProduto = rs.getString("p_descricao");
					final Produto produto = new Produto(nomeDoProduto, descricaoDoProduto);
					produto.setId(idDoProduto);
					ultima.adiciona(produto);
				}
			}
		}
		return categorias;
	}

}
